import axios from 'axios'
import Vue from 'vue'
import mMessage from '@/common/message'
import router from '@/router'
import store from "@/store"
import utils from '@/common/utils'
import i18n from '@/i18n'
import ojApi from '@/common/apiOJ'
import adminApi from '@/common/apiAdmin'

Vue.prototype.$http = axios

//请求超时时间
axios.defaults.timeout = 90000;

//axios请求拦截器 请求前做配置
axios.interceptors.request.use(
    config => {
        //NProgress.start();
        //每次发送请求之前判断vuex中是否存在token
        //如果存在则统一在http请求的header中加上token，后台可根据token判断用户登录情况
        //即使本地存在token，token也有可能是过期的，因此需要在响应拦截器中要对返回状态进行判断
        const token = localStorage.getItem('token')
        if (config.url != '/api/login' && config.url != '/api/admin/login') {
            token && (config.headers.Authorization = token);
        }
        let type = config.url.split("/")[1];
        if (type === 'admin') {
            //携带请求区别是否为admin
            config.headers['Url-Type'] = type
        } else {
            config.headers['Url-Type'] = 'general'
        }
        return config;
    },
    error => {
        //NProgress.done();
        mMessage.error(error.response.data.msg);
        Vue.prototype.$notify.error({
            title: i18n.t('m.Error'),
            message: error.response.data.msg,
            duration: 5000,
            offset: 50
        });
        return Promise.error(error);
    }
)

//axios响应拦截器
axios.interceptors.response.use(
    response => {
        // NProgress.done();
        if (response.headers['refresh-token']) {
            //对用户token进行更新
            store.commit('changeUserToken', response.headers['authorization'])
        }
        //处理响应数据
        if (response.data.status === 200 || response.data.status == undefined) {
            return Promise.resolve(response);
        } else {
            mMessage.error(response.data.msg);
            Vue.prototype.$notify.error({
                title: i18n.t('m.Error'),
                message: response.data.msg,
                duration: 5000,
                offset: 50
            });
            //响应失败处理
            return Promise.reject(response);
        }

    },
    //服务器状态码不是200的情况
    error => {
        //NProgress.done();
        if (error.response) {
            if (error.response.headers['refresh-token']) {
                //对用户token进行更新
                store.commit('changeUserToken', error.response.headers['authorization'])
            }
            if (error.response.data instanceof Blob) {
                //如果是文件操作的返回，由后续进行处理
                return Promise.resolve(error.response);
            }
            switch (error.response.status) {
                //401：未登录 token过期
                //未登录则跳转登录页面，并携带当前页面的路径
                //在登录成功后返回当前页面，这一步需要在登录页操作。
                case 401:
                    if (error.response.data.msg) {
                        mMessage.error(error.response.data.msg);
                        Vue.prototype.$notify.error({
                            title: i18n.t('m.Error'),
                            message: error.response.data.msg,
                            duration: 5000,
                            offset: 50
                        });
                    }
                    if (error.response.config.headers['Url-Type'] === 'admin') {
                        //管理员则跳转至管理员登录
                        router.push("/api/admin/login")
                    } else {
                        store.commit('changeModalStatus', {mode: 'Login', visible: true});
                    }
                    //清空当前用户信息和token
                    store.commit('clearUserInfoAndToken');
                    break;
                //403：无权限访问或操作的请求
                case 403:
                    if (error.response.data.msg) {
                        mMessage.error(error.response.data.msg);
                        Vue.prototype.$notify.error({
                            title: i18n.t('m.Error'),
                            message: error.response.data.msg,
                            duration: 5000,
                            offset: 50
                        });
                    }
                    if (error.response.config.url.startsWith('/api/admin')) {
                        router.push("/admin")
                    }
                    break;
                //404：请求不存在
                case 404:
                    mMessage.error(i18n.t('m.Query_error_unable_to_find_the_resource_to_request'));
                    break;
                //其他错误：直接抛出错误提示
                default:
                    if (error.response.data) {
                        if (error.response.data.msg) {
                            mMessage.error(error.response.data.msg);
                            Vue.prototype.$notify.error({
                                title: i18n.t('m.Error'),
                                message: error.response.data.msg,
                                duration: 5000,
                                offset: 50
                            });
                        } else {
                            mMessage.error(i18n.t('m.Server_error_please_refresh_again'));
                        }
                    }
                    break;
            }
            return Promise.reject(error);
        } else {
            //处理断网或请求超时，请求没响应
            if (error.code == 'ECONNABORTED' || error.message.includes('timeout')) {
                mMessage.error(i18n.t('m.Request_timed_out_please_try_again_later'));
            } else {
                mMessage.error(i18n.t('m.Network_error_abnormal_link_with_server_please_try_again_later'));
            }
            return Promise.reject(error);
        }
    }
);

// 集中导出oj前台的api和admin管理端的api
let api = Object.assign(ojApi, adminApi)
export default api